package com.reportes;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRResultSetDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import com.Reporte;
import com.util.Util;

import exceptions.InvalidArgumentException;

public class AccionEspecifica extends Reporte {

	private static final String ACCION_ESPECIFICA_ID = "accionEspecificaId";
	private static final String ID_ESTADO = "estadoId";
	private static final String ID_MUNICIPIO = "municipioId";
	private static final String ID_PARROQUIA = "parroquiaId";
	private static final String ID_COMPONENTE = "componenteId";
	private static final String FECHADESDE = "fechaDesde";
	private static final String FECHAHASTA = "fechaHasta";
	private String criterioSQL = " WHERE TRUE ";

	@Override
	public void VerificarParametros(HttpServletRequest request) throws InvalidArgumentException {
		Integer id = Util.toInteger(request.getParameter(ACCION_ESPECIFICA_ID));
		if (id != null){
			criterioSQL = " AND Accion_especifica.id =" + id;
			return;
		}
		if (request.getParameter(FECHADESDE) != null || request.getParameter(FECHAHASTA) != null) {
			Date fechaDesde = Util.toDate(request.getParameter(FECHADESDE),	FECHADESDE);
			Date fechaHasta = Util.toDate(request.getParameter(FECHAHASTA),	FECHADESDE);
			if (fechaDesde.getTime() > fechaHasta.getTime())
				throw new InvalidArgumentException("El parametro fechaDesde es mayor al parametro fechaHasta");
			criterioSQL += " and accion_especifica.fecha_inicio>='" + request.getParameter(FECHADESDE) + "'" +
						   " and accion_especifica.fecha_fin<='" + request.getParameter(FECHAHASTA) + "'";
		}
		id = Util.toInteger(request.getParameter(ID_COMPONENTE));
		if (id != null)
			criterioSQL = " AND componente.id= "+ id;
		id = Util.toInteger(request.getParameter(ID_ESTADO));
		if (id != null)
			criterioSQL = " AND estado.id= "+ id;
		id = Util.toInteger(request.getParameter(ID_MUNICIPIO));
		if (id != null)
			criterioSQL = " AND municipio.id= "+ id;
		id = Util.toInteger(request.getParameter(ID_PARROQUIA));
		if (id != null)
			criterioSQL = " AND parroquia.id= "+ id;
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		AccionEspecifica reporte = new AccionEspecifica();
		copyAttributesTo(reporte);
		return reporte;
	}

	@Override
	protected JRDataSource executeQuery(Connection connection) throws SQLException {
		StringBuffer sql =
			new StringBuffer("SELECT")
					.append(" Proyecto.nombre as pnombre,")
					.append(" Componente.descripcion AS conombre,")
					.append(" Accion_general.nombre as anombre,")
					.append(" Accion_especifica.id AS acodigo,")
					.append(" Accion_especifica.fecha_registro,")
					.append(" Accion_especifica.fecha_inicio,")
					.append(" Accion_especifica.fecha_fin,")
					.append(" Criterio_clasificacion.nombre as crnombre,")
					.append(" Accion_especifica.contenido_criterio,")
					.append(" Accion_especifica.bienes_entregados,")
					.append(" Estado.nombre as enombre,")
					.append(" Municipio.nombre as mnombre,")
					.append(" Parroquia.nombre as pnombre,")
					.append(" Caserio.nombre as canombre,")
					.append(" Microcuenca.nombre as minombre")
					.append(" FROM")
					.append(" Accion_especifica")
					.append(" INNER JOIN Accion_general ON (Accion_especifica.accion_general_id = accion_general.id)")
					.append(" INNER JOIN Criterio_clasificacion ON (Accion_general.criterio_clasificacion_id = Criterio_clasificacion.id)")
					.append(" INNER JOIN Proyecto ON (Accion_general.proyecto_id = Proyecto.id)")
					.append(" INNER JOIN Componente ON (Accion_especifica.componente_id = componente.id)")
					.append(" INNER JOIN Caserio ON (Accion_especifica.caserio_id = Caserio.id)")
					.append(" INNER JOIN Microcuenca on (caserio.microcuenca_id = Microcuenca.id)")
					.append(" INNER JOIN Parroquia ON (Caserio.parroquia_id = Parroquia.id)")
					.append(" INNER JOIN Municipio ON (parroquia.municipio_id = Municipio.id)")
					.append(" INNER JOIN Estado ON (Estado.id = municipio.estado_id)")
					.append(criterioSQL)
					.append(" ORDER BY ")
					.append(" Proyecto.nombre,Componente.descripcion,")
					.append(" Accion_especifica.id,Estado.nombre,")
					.append(" Municipio.nombre,Parroquia.nombre,")
					.append(" Caserio.nombre");
		Statement statement = connection.createStatement();
		ResultSet rs = statement.executeQuery(sql.toString());
		setParametrosJasper("SUBREPORT_DIR", "/jasper/AccionEspecifica/");
		setParametrosJasper("REPORT_CONNECTION", connection);
		return new JRResultSetDataSource(rs);
	}
}
